﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace JogoDaVelha
{
    public partial class Form1 : Form
    {
        int jogo; // 0- o jogo nao começou, 1-vs PC, 2-vs Usuario
        int placar1, placar2;
        int jogador; //jogador da vez
        // 1 - O , 2 - X

        Image bola_preta = JogoDaVelha.Properties.Resources.bola_preta;
        Image x_preto = JogoDaVelha.Properties.Resources.x_preto;
        Image bola_vermelha = JogoDaVelha.Properties.Resources.bola_vermelha;
        Image x_vermelho = JogoDaVelha.Properties.Resources.x_vermelho;
        int[,] tabela = new int[3,3];
        
        public Form1()
        {
            InitializeComponent();
            jogo = 0;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            
        }

        private void btnPc_Click(object sender, EventArgs e)
        {
            jogo = 1;
            placar1 = placar2 = 0;
            jogador = 1;
            lblAviso.Text = "                               Vez do O";
            lblPlacar.Text = "Usuario   " + placar1 + "  X  " + placar2 + "   Computador";
            lblId1.Text = "O - Usuario";
            lblId2.Text = "X - Computador";
            zerar();
        }

        private void btnUsuario_Click(object sender, EventArgs e)
        {
            jogo = 2;
            placar1 = placar2 = 0;
            jogador = 1;
            zerar();
            lblAviso.Text = "                               Vez do O";
            lblPlacar.Text = "Usuario1   " + placar1 + "  X  " + placar2 + "   Usuario2";
            lblId1.Text = "O - Usuario1";
            lblId2.Text = "X - Usuario2";
        }

        private void mudaCor(int n, int m, int player) 
        {
            if (player == 2)
            {
                if (n == 0)
                {
                    if (m == 0)
                        b1.BackgroundImage = x_vermelho;
                    else if (m == 1)
                        b2.BackgroundImage = x_vermelho;
                    else
                        b3.BackgroundImage = x_vermelho;
                }
                else if (n == 1)
                {
                    if (m == 0)
                        b4.BackgroundImage = x_vermelho;
                    else if (m == 1)
                        b5.BackgroundImage = x_vermelho;
                    else
                        b6.BackgroundImage = x_vermelho;
                }
                else
                {
                    if (m == 0)
                        b7.BackgroundImage = x_vermelho;
                    else if (m == 1)
                        b8.BackgroundImage = x_vermelho;
                    else
                        b9.BackgroundImage = x_vermelho;
                }
            }
            else
            {
                if (n == 0)
                {
                    if (m == 0)
                        b1.BackgroundImage = bola_vermelha;
                    else if (m == 1)
                        b2.BackgroundImage = bola_vermelha;
                    else
                        b3.BackgroundImage = bola_vermelha;
                }
                else if (n == 1)
                {
                    if (m == 0)
                        b4.BackgroundImage = bola_vermelha;
                    else if (m == 1)
                        b5.BackgroundImage = bola_vermelha;
                    else
                        b6.BackgroundImage = bola_vermelha;
                }
                else
                {
                    if (m == 0)
                        b7.BackgroundImage = bola_vermelha;
                    else if (m == 1)
                        b8.BackgroundImage = bola_vermelha;
                    else
                        b9.BackgroundImage = bola_vermelha;
                }
            }
        }

        //retorna 1 se acabou o jogo e 2 se empatou
        private int verificaJogo(int vez) {
            int i, j, player, aux;

            if(vez == 1)
                lblAviso.Text = "                               Vez do X";
            else
                lblAviso.Text = "                               Vez do O";
            
            for (i = 0; i < 3; i++) 
            { 
                player = tabela[i, 0];
                if (vez == player)
                {
                    if (tabela[i, 0] == tabela[i, 1] && tabela[i, 0] == tabela[i, 2])
                    {
                        mudaCor(i, 0, player);
                        mudaCor(i, 1, player);
                        mudaCor(i, 2, player);
                        return 1;
                    }
                }
                player = tabela[0, i];
                if(vez == player)
                    if (tabela[0, i] == tabela[1, i] && tabela[2, i] == tabela[0, i])
                    {
                        mudaCor(0, i, player);
                        mudaCor(1, i, player);
                        mudaCor(2, i, player);
                        return 1;
                    }
            }
       
            player = tabela[1, 1];
            if (player == vez)
            {
                if (tabela[1, 1] == tabela[0, 0] && tabela[1, 1] == tabela[2, 2])
                {
                    mudaCor(1, 1, player);
                    mudaCor(0, 0, player);
                    mudaCor(2, 2, player);
                    return 1;
                }
                if (tabela[1, 1] == tabela[2, 0] && tabela[1, 1] == tabela[0, 2])
                {
                    mudaCor(2, 0, player);
                    mudaCor(1, 1, player);
                    mudaCor(0, 2, player);
                    return 1;
                }
            }

            aux = 0;
            for (i = 0; i < 3; i++)
                for (j = 0; j < 3; j++)
                {
                    if (tabela[i, j] == 0)
                        break;
                    else
                        aux++;
                }
            if (aux == 9)
                return 2;

            if (jogo == 1 && vez == 1)
                computador();

            if (jogo == 1)
                jogador = 1;//para voltar a vez para o usuario
            
            return 0;
        }

        private void zerar()
        {
            int i, j;
            for (i = 0; i < 3; i++)
                for (j = 0; j < 3; j++)
                    tabela[i, j] = 0;
            /*b1.Text = "";
            b2.Text = "";
            b3.Text = "";
            b4.Text = "";
            b5.Text = "";
            b6.Text = "";
            b7.Text = "";
            b8.Text = "";
            b9.Text = "";*/
            b1.BackgroundImage = null;
            b2.BackgroundImage = null;
            b3.BackgroundImage = null;
            b4.BackgroundImage = null;
            b5.BackgroundImage = null;
            b6.BackgroundImage = null;
            b7.BackgroundImage = null;
            b8.BackgroundImage = null;
            b9.BackgroundImage = null;
        }

        private void fimJogo(int vencedor) 
        {
            if (vencedor == 0)
            {
                MessageBox.Show("Empatou!!");
            }
            else if (jogo == 1)
            {
                if (vencedor == 1)
                {
                    placar1++;
                    MessageBox.Show("Você ganhou!!\n Usuario " + placar1 + " X " + placar2 + " Computador");
                }
                else
                {
                    placar2++;
                    MessageBox.Show("Você Perdeu!!\n Usuario " + placar1 + " X " + placar2 + " Computador");
                }
                lblPlacar.Text = "Usuario   " + placar1 + "  X  " + placar2 + "   Computador";
            }
            else
            {
                if (vencedor == 1)
                {
                    placar1++;
                    MessageBox.Show("O usuario 1 ganhou!!\n Usuario1 " + placar1 + " X " + placar2 + " Usuario2");
                }
                else
                {
                    placar2++;
                    MessageBox.Show("O usuario 2 ganhou!!\n Usuario1 " + placar1 + " X " + placar2 + " Usuario2");
                }
                lblPlacar.Text = "Usuario1   " + placar1 + "  X  " + placar2 + "   Usuario2";
            }
            if (jogo == 1) jogador = 1;
            zerar(); //zera a tabela
        }

        //marca a jogada do pc
        private void marcar(int n, int m)
        {
            if (n == 0)
            {
                if (m == 0)
                    //b1.Text = "X";
                    b1.BackgroundImage = x_preto;
                else if (m == 1)
                    //b2.Text = "X";
                    b2.BackgroundImage = x_preto;
                else
                    //b3.Text = "X";
                    b3.BackgroundImage = x_preto;
            }
            else if (n == 1)
            {
                if (m == 0)
                    //b4.Text = "X";
                    b4.BackgroundImage = x_preto;
                else if (m == 1)
                    //b5.Text = "X";
                    b5.BackgroundImage = x_preto;
                else
                    //b6.Text = "X";
                    b6.BackgroundImage = x_preto;
            }
            else
            {
                if (m == 0)
                    //b7.Text = "X";
                    b7.BackgroundImage = x_preto;
                else if (m == 1)
                    //b8.Text = "X";
                    b8.BackgroundImage = x_preto;
                else
                    //b9.Text = "X";
                    b9.BackgroundImage = x_preto;
            }
        }       

        private void computador() 
        {
            int i, j, aux = 0, cont, zero;
            int p = -1, q = -1, r = -1, s = -1; //indice auxiliares para possiveis jogadas
            //vai ser salvo nessas variaveis lugares vazios em que com mais uma jogada seja possivel ganhar
            
            //verificar se possivel ganhar com a proxima jogada
            for (i = 0; i < 3; i++)
            {
                cont = zero = 0;
                for (j = 0; j < 3; j++)
                {
                    if (tabela[i, j] == 1)
                    {
                        cont = -1;
                        break;
                    }
                    if (tabela[i, j] == 0) zero = 1;
                    if (tabela[i, j] == 2)
                        cont++;
                    else
                    {
                        p = i;
                        q = j;
                    }
                }
                if (cont == 2 && zero == 1) //faz uma linha
                {
                    for (j = 0; j < 3; j++)
                    {
                        if (tabela[i, j] == 0)
                        {
                            tabela[i, j] = 2;
                            marcar(i, j);
                            break;
                        }
                    }
                    aux = 1;
                    break;
                }
                else if (cont == -1)
                {
                    p = q = -1;
                }
                
                cont = zero = 0;
                for (j = 0; j < 3; j++)
                {
                    if (tabela[j, i] == 1)
                    {
                        cont = -1;
                        break;
                    }
                    if (tabela[j, i] == 0) zero = 1;
                    if (tabela[j, i] == 2)
                        cont++;
                    else
                    {
                        p = j;
                        q = i;
                    }
                }
                if (cont == 2 && zero == 1) //faz uma coluna
                {
                    for (j = 0; j < 3; j++)
                        if (tabela[j, i] == 0)
                        {
                            tabela[j, i] = 2;
                            marcar(j, i);
                            break;
                        }
                    aux = 1;
                    break;
                }
                else if (cont == -1)
                    p = q = -1;
            }
            
            //verifica a diagonal
            if (aux == 0 && (tabela[1,1] == 2 || tabela[1,1] == 0))
            {
                cont = zero = 0;
                for (i = 0; i < 3; i++)
                {
                    if (tabela[i, i] == 1)
                        cont = -5;
                    else if (tabela[i, i] == 2)
                        cont++;
                    else
                        p = q = i;
                    for (j = 0; j < 3; j++)
                    {
                        if (i+j == 2)
                        {
                            if (tabela[i, j] == 2)
                                aux++;
                            else if (tabela[i, j] == 1)
                                aux = -5;
                            else
                            {
                                r = i;
                                s = j;
                            }
                        }
                    }
                }
          
                if (cont == 2)
                {
                    for (j = 0; j < 3; j++)
                        if (tabela[j, j] == 0)
                        {
                            tabela[j, j] = 2;
                            marcar(j, j);
                            zero = 1;
                            break;
                        }
                    if(zero == 1)
                        aux = 1;
                }
                if (aux == 2 && zero == 0)
                {
                    for (i = 0; i < 3; i++ )
                        for (j = 0; j < 3; j++)
                            if (i + j == 2 && tabela[i, j] == 0)
                            {
                                zero = 1;
                                tabela[i, j] = 2;
                                marcar(i, j);
                                break;
                            }
                    if(zero == 1)
                        aux = 1;
                }
                else if (cont < 0 && aux < 0)
                {
                    p = q = r = s = -1;
                    aux = 0;
                }
                else if (cont < 0)
                {
                    p = q = -1;
                    aux = 0;
                }
                else
                    aux = 0;
            }

            //verifica se tem necessidade de bloqueiar a jogada do usuario
            if (aux == 0)
            {
		        for (i = 0; i < 3; i++)
		        {
		            cont = zero = 0;
		            for (j = 0; j < 3; j++)
		            {
		                if (tabela[i, j] == 2)
		                {
		                    cont = -1;
		                    break;
		                }
		                if (tabela[i, j] == 1)
		                    cont++;
                        if (tabela[i, j] == 0) zero = 1;
		            }
		            if (cont == 2 && zero == 1) //o oponente pode fazer essa linha
		            {
		                for (j = 0; j < 3; j++)
		                    if (tabela[i, j] == 0)
		                    {
		                        tabela[i, j] = 2;
		                        marcar(i, j);
		                        break;
		                    }
		                aux = 1;
                        break;
		            }
                   
		            cont = zero = 0;
		            for (j = 0; j < 3; j++)
		            {
		                if (tabela[j, i] == 2)
		                {
		                    cont = -1;
		                    break;
		                }
		                if (tabela[j, i] == 1)
		                    cont++;
                        if (tabela[i, j] == 0)
                            zero = 1;
		            }
		            if (cont == 2 && zero == 1) //o oponente pode fazer essa coluna
		            {
		                for (j = 0; j < 3; j++)
		                    if (tabela[j, i] == 0)
		                    {
		                        tabela[j, i] = 2;
		                        marcar(j, i);
		                        break;
		                    }
		                aux = 1;
		                break;
		            }
		        }
                
		        //verifica a diagonal precisa de bloqueio
		        if (aux == 0 && (tabela[1,1] == 1 || tabela[1,1] == 0))
		        {
		            cont = zero = 0;
		            for (i = 0; i < 3; i++)
		            {
		                if (tabela[i, i] == 1)
		                    cont++;
		                for (j = 0; j < 3; j++)
		                {
		                    if (i+j == 2)
		                    {
                                if (tabela[i, j] == 1)
                                    aux++;
                                else if (tabela[i, j] == 2)
                                    aux = -5;
		                    }
		                }
		            }
                    
		            if (cont == 2)
		            {
		                for (j = 0; j < 3; j++)
		                    if (tabela[j, j] == 0)
		                    {
		                        tabela[j, j] = 2;
		                        marcar(j, j);
                                zero = 1;
		                        break;
		                    }
                        if(zero == 1)
		                    aux = 1;
		            }
		            
                    if (aux == 2 && zero == 0)
		            {
                        for (i = 0; i < 3; i++ )
                            for (j = 0; j < 3; j++)
                                if (i + j == 2 && tabela[i, j] == 0)
                                {
                                    tabela[i, j] = 2;
                                    marcar(i, j);
                                    zero = 1;
                                    break;
                                }
		                if(zero == 1)
                            aux = 1;
		            }
                    if(zero == 0)
                    {
                        aux = 0;
                    }
		        }
            }

            //coloca preferencialmente no meio
            if (aux == 0 && tabela[1, 1] == 0)
            {
                tabela[1, 1] = 2;
                //b5.Text = "X";
                b5.BackgroundImage = x_preto;
                aux = 1;
            }

            //outros
            if (aux == 0)
            {
                if (p > 0 && q > 0)
                {
                    tabela[p, q] = 2;
                    marcar(p, q);
                }
                else if (r > 0 && s > 0)
                {
                    tabela[r, s] = 2;
                    marcar(r, s);
                }
                else
                {
                    //random
                    //colocar em qualquer lugar
                    Random aux1 = new Random(DateTime.Now.Millisecond);
                    int lugar;
                    while (aux == 0)
                    {
                        lugar = aux1.Next() % 9;
                        if (lugar == 0 && tabela[0, 0] == 0)
                        {
                            tabela[0, 0] = 2;
                            marcar(0, 0);
                            break;
                        }
                        else if (lugar == 1 && tabela[0, 1] == 0)
                        {
                            tabela[0, 1] = 2;
                            marcar(0, 1);
                            break;
                        }
                        else if (lugar == 2 && tabela[0, 2] == 0)
                        {
                            tabela[0, 2] = 2;
                            marcar(0, 2);
                            break;
                        }
                        else if (lugar == 3 && tabela[1, 0] == 0)
                        {
                            tabela[1, 0] = 2;
                            marcar(1, 0);
                            break;
                        }
                        else if (lugar == 4 && tabela[1, 1] == 0)
                        {
                            tabela[1, 1] = 2;
                            marcar(1, 1);
                            break;
                        }
                        else if (lugar == 5 && tabela[1, 2] == 0)
                        {
                            tabela[1, 2] = 2;
                            marcar(1, 2);
                            break;
                        }
                        else if (lugar == 6 && tabela[2, 0] == 0)
                        {
                            tabela[2, 0] = 2;
                            marcar(2, 0);
                            break;
                        }
                        else if (lugar == 7 && tabela[2, 1] == 0)
                        {
                            tabela[2, 1] = 2;
                            marcar(2, 1);
                            break;
                        }
                        else if (lugar == 8 && tabela[2, 2] == 0)
                        {
                            tabela[2, 2] = 2;
                            marcar(2, 2);
                            break;
                        }
                    }
                }
            }
            aux = verificaJogo(2);
            if (aux == 1)
                fimJogo(2);
            else if (aux == 2)
                fimJogo(0);
        }

        private void b1_Click(object sender, EventArgs e)
        {
            int aux;
            if (jogo > 0 && tabela[0,0] == 0)
            {
                tabela[0, 0] = jogador;
                if (jogador == 1)
                {
                    //b1.Text = "O";
                    b1.BackgroundImage = bola_preta;
                    jogador = 2;
                }
                else 
                {
                    //b1.Text = "X";
                    b1.BackgroundImage = x_preto;
                    jogador = 1;
                }
                aux = verificaJogo(2 - ((jogador + 1) % 2));
                if (aux == 1)
                    fimJogo(2 - ((jogador + 1) % 2));
                else if (aux == 2)
                    fimJogo(0);
            }
        }

        private void b2_Click(object sender, EventArgs e)
        {
            int aux;
            if (jogo > 0 && tabela[0, 1] == 0)
            {
                tabela[0, 1] = jogador;
                if (jogador == 1)
                {
                    //b2.Text = "O";
                    b2.BackgroundImage = bola_preta;
                    jogador = 2;
                }
                else
                {
                    //b2.Text = "X";
                    b2.BackgroundImage = x_preto;
                    jogador = 1;
                }
                aux = verificaJogo(2 - ((jogador + 1) % 2));
                if (aux == 1)
                    fimJogo(2 - ((jogador + 1) % 2));
                else if (aux == 2)
                    fimJogo(0);
            }
        }

        private void b3_Click(object sender, EventArgs e)
        {
            int aux;
            if (jogo > 0 && tabela[0, 2] == 0)
            {
                tabela[0, 2] = jogador;
                if (jogador == 1)
                {
                    //b3.Text = "O";
                    b3.BackgroundImage = bola_preta;
                    jogador = 2;
                }
                else
                {
                    //b3.Text = "X";
                    b3.BackgroundImage = x_preto;
                    jogador = 1;
                }
                aux = verificaJogo(2 - ((jogador + 1) % 2));
                if (aux == 1)
                    fimJogo(2 - ((jogador + 1) % 2));
                else if (aux == 2)
                    fimJogo(0);
            }
        }

        private void b4_Click(object sender, EventArgs e)
        {
            int aux;
            if (jogo > 0 && tabela[1, 0] == 0)
            {
                tabela[1, 0] = jogador;
                if (jogador == 1)
                {
                    //b4.Text = "O";
                    b4.BackgroundImage = bola_preta;
                    jogador = 2;
                }
                else
                {
                    //b4.Text = "X";
                    b4.BackgroundImage = x_preto;
                    jogador = 1;
                }
                aux = verificaJogo(2 - ((jogador + 1) % 2));
                if (aux == 1)
                    fimJogo(2 - ((jogador + 1) % 2));
                else if (aux == 2)
                    fimJogo(0);
            }
        }

        private void b5_Click(object sender, EventArgs e)
        {
            int aux;
            if (jogo > 0 && tabela[1, 1] == 0)
            {
                tabela[1, 1] = jogador;
                if (jogador == 1)
                {
                    //b5.Text = "O";
                    b5.BackgroundImage = bola_preta;
                    jogador = 2;
                }
                else
                {
                    //b5.Text = "X";
                    b5.BackgroundImage = x_preto;
                    jogador = 1;
                }
                aux = verificaJogo(2 - ((jogador + 1) % 2));
                if (aux == 1)
                    fimJogo(2 - ((jogador + 1) % 2));
                else if (aux == 2)
                    fimJogo(0);
            }
        }

        private void b6_Click(object sender, EventArgs e)
        {
            int aux;
            if (jogo > 0 && tabela[1, 2] == 0)
            {
                tabela[1, 2] = jogador;
                if (jogador == 1)
                {
                    //b6.Text = "O";
                    b6.BackgroundImage = bola_preta;
                    jogador = 2;
                }
                else
                {
                    //b6.Text = "X";
                    b6.BackgroundImage = x_preto;
                    jogador = 1;
                }
                aux = verificaJogo(2 - ((jogador + 1) % 2));
                if (aux == 1)
                    fimJogo(2 - ((jogador + 1) % 2));
                else if (aux == 2)
                    fimJogo(0);
            }
        }

        private void b7_Click(object sender, EventArgs e)
        {
            int aux;
            if (jogo > 0 && tabela[2, 0] == 0)
            {
                tabela[2, 0] = jogador;
                if (jogador == 1)
                {
                    //b7.Text = "O";
                    b7.BackgroundImage = bola_preta;
                    jogador = 2;
                }
                else
                {
                    //b7.Text = "X";
                    b7.BackgroundImage = x_preto;
                    jogador = 1;
                }
                aux = verificaJogo(2 - ((jogador + 1) % 2));
                if (aux == 1)
                    fimJogo(2 - ((jogador + 1) % 2));
                else if (aux == 2)
                    fimJogo(0);
            }
        }

        private void b8_Click(object sender, EventArgs e)
        {
            int aux;
            if (jogo > 0 && tabela[2, 1] == 0)
            {
                tabela[2, 1] = jogador;
                if (jogador == 1)
                {
                    //b8.Text = "O";
                    b8.BackgroundImage = bola_preta;
                    jogador = 2;
                }
                else
                {
                    //b8.Text = "X";
                    b8.BackgroundImage = x_preto;
                    jogador = 1;
                }
                aux = verificaJogo(2 - ((jogador + 1) % 2));
                if (aux == 1)
                    fimJogo(2 - ((jogador + 1) % 2));
                else if (aux == 2)
                    fimJogo(0);
            }
        }

        private void b9_Click(object sender, EventArgs e)
        {
            int aux;
            if (jogo > 0 && tabela[2, 2] == 0)
            {
                tabela[2, 2] = jogador;
                if (jogador == 1)
                {
                    //b9.Text = "O";
                    b9.BackgroundImage = bola_preta;
                    jogador = 2;
                }
                else
                {
                    //b9.Text = "X";
                    b9.BackgroundImage = x_preto;
                    jogador = 1;
                }
                aux = verificaJogo(2 - ((jogador + 1) % 2));
                if (aux == 1)
                    fimJogo(2 - ((jogador + 1) % 2));
                else if (aux == 2)
                    fimJogo(0);
            }
        }
    }
}
